﻿// 项目：	Guan.CMS.Data - Guan.CMS
// 文件名：	CmsDataContext.cs
// 
// 修改时间：2013-03-09 0:42
// 修改人：	Cooclsee

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using Guan.CMS.Data.Configurations;
using Guan.CMS.Model.Entities;

namespace Guan.CMS.Data
{
    public class CmsDataContext : DbContext
    {
        public DbSet<SiteConfig> SiteConfigs { get; set; }
        public DbSet<Product> Products { get; set; }
        public DbSet<ProductCategory> ProductCategories { get; set; }
        public DbSet<Supplier> Suppliers { get; set; }
        public DbSet<Media> Files { get; set; }
        public DbSet<Article> Articles { get; set; }
        public DbSet<ArticleCategory> ArticleCategories { get; set; }
        //public DbSet<SNSShareInfo> SNSShareInfos { get; set; }
        public DbSet<User> Users { get; set; }
        public DbSet<Contact> Contacts { get; set; }

        public virtual void Commit()
        {
            base.SaveChanges();
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new ArticleConfiguration());
            modelBuilder.Configurations.Add(new ArticleCategoryConfiguration());
            modelBuilder.Configurations.Add(new ProductConfiguration());
            modelBuilder.Configurations.Add(new ProductCategoryConfiguration());
            modelBuilder.Configurations.Add(new SiteConfigConfiguration());
            modelBuilder.Configurations.Add(new ContactConfiguration());

            //modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
            //移除复数表名的契约
            //modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

            //modelBuilder.Configurations.Add(new SiteConfigConfiguration());
            /*modelBuilder.Configurations.Add(new ExpenseConfiguration());*/

            //动态制定前缀和Schema
            /*var dataPrefix = ConfigurationManager.AppSettings["DataPrefix"];
            if (!string.IsNullOrEmpty(dataPrefix))
            {
                dataPrefix += "_";
            }
            var dataSchema = ConfigurationManager.AppSettings["DataSchema"];
            if (string.IsNullOrEmpty(dataSchema))
            {
                dataSchema = "dbo";
            }
            modelBuilder.Entity<Product>().ToTable("Product","dbo");*/

            //防止黑幕交易 要不然每次都要访问 EdmMetadata这个表
            //modelBuilder.Conventions.Remove<IncludeMetadataConvention>();
            //定义Customer、Room多对多关系
            /*modelBuilder.Entity<Order>().HasMany(c => c.Rooms)
                .WithMany(c => c.Orders).Map(m =>
                {
                    m.MapLeftKey("OrderID");
                    m.MapRightKey("RoomID");
                    m.ToTable("OrderRooms");
                });*/
            /*
            可以删除的公约有：
            Namespace:System.Data.Entity.ModelConfiguration.Conventions.Edm
            • AssociationInverseDiscoveryConvention
            寻找导航上互相引用的类的属性，并将它们配置为逆属性的相同的关系。
            • ComplexTypeDiscoveryConvention
            寻找有没有主键的类型，并将它们配置为复杂类型。
            • DeclaredPropertyOrderingConvention
            确保每个实体的主要关键属性优先于其他属性。
            • ForeignKeyAssociationMultiplicityConvention
            配置是必需的还是可选的关系基于为空性外键属性，如果包含在类定义中。
            • IdKeyDiscoveryConvention
            查找名为 Id 或 <TypeName> Id 的属性，并将他们配置作为主键。
            • NavigationPropertyNameForeignKeyDiscoveryConvention
            使用外键关系，使用 <NavigationProperty> <PrimaryKeyProperty> 模式作为属性的外观。
            • OneToManyCascadeDeleteConvention
            交换机上层叠删除，所需的关系。
            • OneToOneConstraintIntroductionConvention
            将配置为一个： 一个关系的外键的主键。
            • PluralizingEntitySetNameConvention
            配置为多元化的类型名称的实体数据模型中的实体集的名称。
            • PrimaryKeyNameForeignKeyDiscoveryConvention
            使用外键关系，使用 <PrimaryKeyProperty> 模式作为属性的外观。
            • PropertyMaxLengthConvention
            配置所有的字符串和字节 [] 属性，默认情况下具有最大长度。
            • StoreGeneratedIdentityKeyConvention
            配置默认情况下将标识所有整数的主键。
            • TypeNameForeignKeyDiscoveryConvention
            使用外键关系，使用 <PrincipalTypeName> <PrimaryKeyProperty> 模式作为属性的外观。
            */
        }
    }
}